package com.pure.common.composite;

import com.pure.common.composite.impl.City;
import com.pure.common.composite.impl.Container;
import lombok.extern.slf4j.Slf4j;

/**
 * @description: 组成/组合模式
 * @date: 2022-05-28 15:58
 * @since 1.2.0
 **/
@Slf4j
public class CompositePattern {

    /**
     * 1、在这个简易的模型中，我们的统计命令由上级向下级进行传达，每一层统计当前层次的人口数量；
     * 2、组合模式 是一种结构型设计模式，你可以使用它将对象组合成树状结构，并且能像使用独立对象一样使用它们；
     * 3、它们是这些对象的个体和它们组合的整体具有一样的功能和接口；
     * 4、结构性模式是介绍如何将对象和类组装成一个较大的结构；
     *
     * 树
     * 1、树是由 树干 和 叶子组成；
     * 2、一条树干包含多个叶子；
     * 3、所以抽象来理解，建立一颗树。主要关注叶子节点和它的容器；
     * 4、那容器可以包含叶子节点也可以包含容器；
     * 5、所以类图中包含两种元素
     * - Leaf 即叶子节点，完成实际工作；
     * - Composite 是组合体，它可以包含更多组合体和叶子节点；
     * - Leaf 和 Composite 需实现同样的接口，这个接口定义他们要有的方法；
     *
     * China
     *     ｜_北京
     *     ｜_上海
     *     ｜_重庆
     *     ｜_山西
     *          ｜_太原市
     *          ｜_大同市
     *          ｜_长治市
     *
     *
     * 优点
     * - 可以利用多态和递归机制更方便地使用复杂树结构；
     * -
     */
    public static void main(String[] args) {

        Container china = new Container();
        china.add(new City(20000)); // 直辖市 - 北京
        china.add(new City(20000)); // 直辖市 - 上海
        china.add(new City(20000)); // 直辖市 - 重庆

        Container Shanxi = new Container(); // 山西省
        Shanxi.add(new City(30000)); // 太原市
        Shanxi.add(new City(40000)); // 大同市
        Shanxi.add(new City(20000)); // 长治市

        china.add(Shanxi);

        log.info("china sum {}", china.count());

    }

}
